#include "DetenerProceso.h"

#include <stdexcept>
#include <gtkmm/menuitem.h>
#include <gtkmm/messagedialog.h>

#include "Socket.h"


DetenerProceso::DetenerProceso(Glib::RefPtr<Gtk::Builder> b, std::string nomMenu, Configuraciones** cfg){
	// Recupera el menuItem y conecta la señal al mismo
	Gtk::MenuItem* mi = 0;
	b->get_widget(nomMenu, mi);
	if (!mi) throw std::runtime_error("No pudo ser encontrado "+nomMenu);

	mi->signal_activate().connect( sigc::mem_fun(*this, &DetenerProceso::enviarStop) );

	// Guarda la referencia a las configuraciones
	this->_ppconfig = cfg;
}


DetenerProceso::~DetenerProceso(){
}


void DetenerProceso::enviarStop(){
	// Si no hay datos de configuraciones guardados se avisa al usuario
	if (*this->_ppconfig == NULL){

		Gtk::MessageDialog md("Error al tratar de detener el servidor");
		md.set_secondary_text("No hay ningun puerto de control configurado");

		md.run();

		return;
	}

	try {
		// Recupera el puerto donde hay que enviar la señal
		unsigned short int puerto = (*this->_ppconfig)->nroPuertoCtrl;

		// El servidor siempre esta en la misma maquina (o deberia)
		ClientSocket cs("127.0.0.1", puerto);

		// "q" es la señal de apagado del servidor
		char q = 'q';
		cs.send(static_cast<void*>( &q ), sizeof(q));

		cs.close();

	} catch (SocketException& sex){
		// Si el servidor no esta corriendo el socket no se puede conectar y tira 
		// una excepcion, en cualquier caso hay que avisarle al usuario que hubo 
		// un error sin reventar todo el programa
		Gtk::MessageDialog md("Error al tratar de detener el servidor");
		md.set_secondary_text("No fue posible realizar la conexión");

		md.run();
	}
}


